
Statement { LookAhead(2) KEY ("=" | "+=") Expression | Expression }

Expression { LogicalOrExpr (LookAhead(2) "?" Expression (LookAhead(2) ":" Expression)?)? }

LogicalOrExpr { LogicalAndExpr ("||" LogicalAndExpr)* }

LogicalAndExpr { EqualityExpr ("&&" EqualityExpr)* }

EqualityExpr { ComparativeExpr (("==" | "!=") ComparativeExpr)* }

ComparativeExpr { AdditiveExpr ((">" | "<" | ">=" | "<=") AdditiveExpr)* }

AdditiveExpr { MultiplicativeExpr (("+" | "-") MultiplicativeExpr)* }

MultiplicativeExpr { UnaryExpr (("*" | "/" | "%") UnaryExpr)* }

UnaryExpr { "-" KeyChain | "!" KeyChain | KeyChain }

KeyChain { Object ("." Object)* }

Object
{
    LookAhead(3) KEY "(" ArgList? ")" | LookAhead(2) KEY "[" Expression "]" | LookAhead(3) KEY | INT | FLOAT | STRING | "(" Expression ")"
}

ArgList { Expression ("," Expression)* }

KEY { "[$_a-zA-Z][$\w]*" }

INT { "[1-9][0-9]*" }

FLOAT { "([0-9]+\.[0-9]*([eE]([\+\-])?([0-9])+)?)|(\.[0-9]+([eE]([\+\-])?([0-9])+)?)|([0-9]+([eE]([\+\-])?([0-9])+)?)" }

STRING { "\"(([^\"\\])|(\\([ntbrf\\'\"]|[0-7][0-7]?|[0-3][0-7][0-7]|u[\da-fA-F]{4})))*\"" }

